﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Infrastructure.CrossCutting.Properties;
using System.Security.Cryptography;

namespace Cesave.Infrastructure.CrossCutting.Hashing
{
    /// <summary>
    /// Provee capicidades para encryptar cadenas.
    /// </summary>
    public static class SaltAndHash
    {

        /// <summary>
        /// Compara dos hashes.
        /// </summary>
        /// <param name="firstHash">
        /// Primer hash.
        /// </param>
        /// <param name="secondHash">
        /// Segundo hash.
        /// </param>
        /// <returns>
        /// Falso/Veradero según el resultado de la comparación.
        /// </returns>
        public static bool HashCompare(string firstHash, string secondHash)
        {
            return firstHash == secondHash;
        }

        /// <summary>
        /// Encripta una cadena.
        /// </summary>
        /// <param name="data">
        /// Cadena a encryptar.
        /// </param>
        /// <returns>
        /// Resultado de la encrptación.
        /// </returns>
        public static string Hash(string data)
        {
			return Hash(data, Settings.Default.SaltKey);
        }

		/// <summary>
		/// Encripta una cadena.
		/// </summary>
		/// <param name="data">
		/// Cadena a encryptar.
		/// </param>
		/// <param name="saltKey">
		/// Llave a utilizar.
		/// </param>
		/// <returns>
		/// Resultado de la encrptación.
		/// </returns>
		public static string Hash(string data, string saltKey)
		{
			byte[] byteSource;
			byte[] byteHash;
			string returnValue;
			// Create a byte array from source data.
			byteSource = ASCIIEncoding.ASCII.GetBytes(data + saltKey);
			// Compute hash based on source data.
			byteHash = new MD5CryptoServiceProvider().ComputeHash(byteSource);
			returnValue = ByteArrayToString(byteHash);
			return returnValue;
		}

        /// <summary>
        /// Convierte un arreglo de bytes a una cadena.
        /// </summary>
        /// <param name="arrInput">
        /// Arreglo de bytes.
        /// </param>
        /// <returns>
        /// <see cref="System.String"/>
        /// </returns>
        private static string ByteArrayToString(byte[] arrInput)
        {
            int i;
            StringBuilder sOutput = new StringBuilder(arrInput.Length);
            for (i = 0; i <= arrInput.Length - 1; i++)
            {
                sOutput.Append(arrInput[i].ToString("X2"));
            }
            return sOutput.ToString();
        }

    }
}
